[코담]
웹개발·실전 프로젝트·AI까지, 파이썬·장고의 모든것을 담아낸 강의와 개발 노트
테이블 정규화(심화) | ✅저자: 이유정(박사)
EMPLOYEE_ACCOUNT
bank_name | account_num | account_id | class | ratio | empl_id | empl_name | card_id |
---|---|---|---|---|---|---|---|
Woori | 010-9231-1121 | a11 | BRONZE | 0.1 | e1 | Sony | c101 |
Woori | 102-992-180125 | a12 | SILVER | 0.2 | e1 | Sony | c102 |
Kookmin | 010-9231-1121 | a13 | LOYAL | 0.7 | e1 | Sony | c103 |
Kookmin | 010-1221-1732 | a21 | LOYAL | 1.0 | e2 | Messi | c201, c202 |
제1정규형 (1NF): 원자성 만족 (한 셀 = 한 값)
- 한 칸에 여러 값이 있는 것(반복 속성) → 각각 분리
⚠️ 문제:
card_id
에 여러 개 값이 있는 행 존재 → 예:"c201, c202"
해결:
- 각 카드 ID를 분리해서 행으로 나눔
account_id | card_id |
---|---|
a11 | c101 |
a12 | c102 |
a13 | c103 |
a21 | c201 |
a21 | c202 |
→ 그리고 card_id는 별도 테이블로 분리해주는 게 좋습니다 (아래에서 3NF에서 적용) |
제2정규형 (2NF): 부분 함수 종속 제거 이미 1NF 만족
⚠️ 문제:
- 복합 키가 아닌 경우에도, 기본키(account_id)에만 의존하지 않는 컬럼이 존재
- 예를 들어,
empl_name
은empl_id
에만 의존함 → 반복됨
해결: 종속성 따라 테이블 분리 테이블 분리 계획
Account 테이블
account_id | bank_name | account_num | class | ratio | empl_id |
---|---|---|---|---|---|
a11 | Woori | 010-9231-1121 | BRONZE | 0.1 | e1 |
a12 | Woori | 102-992-180125 | SILVER | 0.2 | e1 |
a13 | Kookmin | 010-9231-1121 | LOYAL | 0.7 | e1 |
a21 | Kookmin | 010-1221-1732 | LOYAL | 1.0 | e2 |
Employee 테이블
empl_id | empl_name |
---|---|
e1 | Sony |
e2 | Messi |
제3정규형 (3NF): 이행적 종속 제거
이행적 종속이란? 기본키가 아닌 컬럼이, 또 다른 기본키가 아닌 컬럼에 종속되는 현상
⚠️ 문제:
class
→ratio
즉, class 값만 보면 ratio가 정해짐 → 이건class
에 종속된 정보지,account_id
에 직접 종속된 정보가 아님
해결: class
와 ratio
를 분리
Class 테이블
class | ratio |
---|---|
BRONZE | 0.1 |
SILVER | 0.2 |
LOYAL | 0.7 |
LOYAL | 1.0 |
하지만 여기서 LOYAL이 두 개의 ratio를 가지면 → class → ratio 관계가 1:1이 아님 → 정규화 불가 → 따라서 class에 따라 ratio가 고정된 경우에만 분리 |
정규화 후 테이블 구조 요약
Account
account_id | bank_name | account_num | class | empl_id |
---|---|---|---|---|
a11 | Woori | 010-9231-1121 | BRONZE | e1 |
a12 | Woori | 102-992-180125 | SILVER | e1 |
a13 | Kookmin | 010-9231-1121 | LOYAL | e1 |
a21 | Kookmin | 010-1221-1732 | LOYAL | e2 |
Employee
empl_id | empl_name |
---|---|
e1 | Sony |
e2 | Messi |
Card
account_id | card_id |
---|---|
a11 | c101 |
a12 | c102 |
a13 | c103 |
a21 | c201 |
a21 | c202 |
ClassRatio
(가능한 경우)
class | ratio |
---|---|
BRONZE | 0.1 |
SILVER | 0.2 |
LOYAL | 0.7 or 1.0 → 둘 중 하나로 고정 시 분리 가능 |